package com.sky.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.sky.constant.JwtClaimsConstant;
import com.sky.dto.UserLoginDTO;
import com.sky.entity.User;
import com.sky.mapper.UserMapper;
import com.sky.properties.JwtProperties;
import com.sky.service.UserService;
import com.sky.service.WeChatService;
import com.sky.utils.JwtUtil;
import com.sky.utils.WeChatLoginUtil;
import com.sky.vo.UserLoginVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;


@Service
@Slf4j
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;
    @Autowired
    private JwtProperties jwtProperties;
    @Autowired
    private WeChatService weChatService;  // 添加这行
    
    @Value("${sky.wechat.appid}")
    private String appid;
    
    @Value("${sky.wechat.secret}")
    private String secret;
    
    @Override
    public UserLoginVO wxLogin(UserLoginDTO userLoginDTO) {
        log.info("微信登录开始，参数为：{}", userLoginDTO);

        // 获取openid
        String code = userLoginDTO.getCode();
        if (code == null || code.trim().isEmpty()) {
            log.error("登录失败：code 为空");
            throw new IllegalArgumentException("code 不能为空");
        }
        String openid = weChatService.getOpenid(code);
        log.info("获取到的openid为：{}", openid);


        // 判断是否为新用户
        User user = userMapper.getByOpenid(openid);
    
        if (user == null) {
            // 新用户，创建用户记录
            // 在创建新用户时
            user = User.builder()
                    .openid(openid)
                    .nickname(userLoginDTO.getUserInfo().getNickName())
                    .avatarUrl(userLoginDTO.getUserInfo().getAvatarUrl())
                    .gender(userLoginDTO.getUserInfo().getGender())
                    .country(userLoginDTO.getUserInfo().getCountry())
                    .province(userLoginDTO.getUserInfo().getProvince())
                    .city(userLoginDTO.getUserInfo().getCity())
                    .language(userLoginDTO.getUserInfo().getLanguage())
                    .phone(userLoginDTO.getUserInfo().getPhone())  // 添加 phone
                    .createTime(LocalDateTime.now())
                    .updateTime(LocalDateTime.now())
                    .build();
            userMapper.insert(user);
        } else {
            // 已存在的用户，更新用户信息
            user.setNickname(userLoginDTO.getUserInfo().getNickName());
            user.setAvatarUrl(userLoginDTO.getUserInfo().getAvatarUrl());
            user.setGender(userLoginDTO.getUserInfo().getGender());
            user.setCountry(userLoginDTO.getUserInfo().getCountry());
            user.setProvince(userLoginDTO.getUserInfo().getProvince());
            user.setCity(userLoginDTO.getUserInfo().getCity());
            user.setLanguage(userLoginDTO.getUserInfo().getLanguage());
            user.setPhone(userLoginDTO.getUserInfo().getPhone());
            user.setUpdateTime(LocalDateTime.now());
            userMapper.update(user);
        }
    
        // 生成 JWT token
        Map<String, Object> claims = new HashMap<>();
        claims.put(JwtClaimsConstant.USER_ID, user.getId());
        String token = JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims);
    
        return UserLoginVO.builder()
                .id(user.getId())
                .openid(user.getOpenid())
                .token(token)
                .nickname(user.getNickname())    // 添加昵称
                .avatarUrl(user.getAvatarUrl())  // 添加头像
                .build();
    }

    @Override
    public User getById(Long userId) {
        return userMapper.getById(userId);
    }
}
